package hash;

import java.util.HashMap;
import java.util.Map;

/**
 * 给你一个数组 nums ，数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。比方说 rev(123) = 321 ，
 * rev(120) = 21 。我们称满足下面条件的下标对 (i, j) 是 好的 ：
 * <p>
 * 0 <= i < j < nums.length
 * nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])
 * 请你返回好下标对的数目。由于结果可能会很大，请将结果对 109 + 7 取余 后返回。
 * <p>
 * 示例 1：
 * 输入：nums = [42,11,1,97]
 * 输出：2
 * 解释：两个坐标对为：
 * - (0,3)：42 + rev(97) = 42 + 79 = 121, 97 + rev(42) = 97 + 24 = 121 。
 * - (1,2)：11 + rev(1) = 11 + 1 = 12, 1 + rev(11) = 1 + 11 = 12 。
 * <p>
 * 示例 2：
 * 输入：nums = [13,10,35,24,76]
 * 输出：4
 *
 * @author Jisheng Huang
 * @version 20250524
 */
public class CountNicePairs_1814 {
    /**
     * 我们从左到右遍历数组 nums，并在遍历的过程用「哈希表」统计每一个位置 i，0≤i<n 的 f(i) 的个数，则对于位置 j，0≤j<n，以 j 结尾的
     * 「好下标对」的个数为此时「哈希表」中 f(j) 的数目。那么我们只需要在遍历时同时统计以每一个位置为结尾的「好下标对」数目即可。
     *
     * @param nums the given integer array
     * @return number of nice pairs
     */
    public static int countNicePairs(int[] nums) {
        int MOD = 1000000007;
        int res = 0;
        Map<Integer, Integer> map = new HashMap<>();

        for (int i : nums) {
            int temp = i;
            int j = 0;

            while (temp > 0) {
                j = j * 10 + temp % 10;
                temp /= 10;
            }

            res = (res + map.getOrDefault(i - j, 0)) % MOD;
            map.put(i - j, map.getOrDefault(i - j, 0) + 1);
        }

        return res;
    }

    public static void main(String[] args) {
        int[] nums = {42, 11, 1, 97};
        System.out.println(countNicePairs(nums));
    }
}
